<?php
namespace ZyucMini\Core;

/**
 * 数据库连接管理器
 * 负责管理多个数据库连接，避免重复连接
 * 
 * @package ZyucMini\Core
 */
class DatabaseManager
{
    /**
     * 数据库连接实例池
     * @var array
     */
    private static $connections = [];
    
    /**
     * 连接配置缓存
     * @var array
     */
    private static $configs = [];
    
    /**
     * 获取数据库连接
     * 
     * @param string $connectionName 连接名称
     * @return Database
     * @throws \Exception
     */
    public static function getConnection($connectionName = 'default')
    {
        // 如果连接已存在且有效，直接返回
        if (isset(self::$connections[$connectionName]) && 
            self::$connections[$connectionName]->isConnected()) {
            return self::$connections[$connectionName];
        }
        
        // 获取连接配置
        $config = self::getConnectionConfig($connectionName);
        if (!$config) {
            throw new \Exception("Database connection [$connectionName] not found in config.");
        }
        
        // 创建新连接
        $dbcon = new Database($config);
        $dbcon->getConnection();
        self::$connections[$connectionName] = $dbcon;
        
        return self::$connections[$connectionName];
    }
    
    /**
     * 获取连接配置
     * 
     * @param string $connectionName
     * @return array|null
     */
    private static function getConnectionConfig($connectionName)
    {
        // 先从缓存中获取
        if (isset(self::$configs[$connectionName])) {
            return self::$configs[$connectionName];
        }
        
        // 从Config中获取
        $config = Config::get('database.' . $connectionName);
        if ($config) {
            self::$configs[$connectionName] = $config;
        }
        
        return $config;
    }
    
    /**
     * 注册数据库连接配置
     * 
     * @param string $connectionName
     * @param array $config
     */
    public static function registerConnection($connectionName, array $config)
    {
        self::$configs[$connectionName] = $config;
        Config::set('database.' . $connectionName, $config);
    }
    
    /**
     * 关闭指定连接
     * 
     * @param string $connectionName
     */
    public static function closeConnection($connectionName)
    {
        if (isset(self::$connections[$connectionName])) {
            self::$connections[$connectionName]->close();
            unset(self::$connections[$connectionName]);
        }
    }
    
    /**
     * 关闭所有连接
     */
    public static function closeAllConnections()
    {
        foreach (self::$connections as $connection) {
            $connection->close();
        }
        self::$connections = [];
    }
    
    /**
     * 获取所有连接状态
     * 
     * @return array
     */
    public static function getConnectionsStatus()
    {
        $status = [];
        foreach (self::$connections as $name => $connection) {
            $status[$name] = [
                'connected' => $connection->isConnected(),
                'in_transaction' => $connection->inTransaction(),
                'config' => $connection->getConfig()
            ];
        }
        return $status;
    }
    
    /**
     * 检查连接是否存在
     * 
     * @param string $connectionName
     * @return bool
     */
    public static function hasConnection($connectionName)
    {
        return isset(self::$connections[$connectionName]);
    }
    
    /**
     * 获取所有已注册的连接名称
     * 
     * @return array
     */
    public static function getRegisteredConnections()
    {
        return array_keys(self::$configs);
    }
    
    /**
     * 清理配置缓存
     */
    public static function clearConfigCache()
    {
        self::$configs = [];
    }
}
